元件大致上的使用規則都已經了解後,這一個單元會實際用一個例子來講解元件的其中一個用法,就是可以使用元件來製作 Tab 的瀏覽方式。
一開始先新增三個元件檔案,分別是 components/Component1.vue:
<template>
  <p>Component1</p>
</template>
<script>
export default {
  name: 'Component1',
};
</script>
components/Component2.vue:
<template>
  <p>Component2</p>
</template>
<script>
export default {
  name: 'Component2',
};
</script>
components/Component3.vue:
<template>
  <p>Component3</p>
</template>
<script>
export default {
  name: 'Component3',
};
</script>
在上層檔案 App.vue 引用這三個元件:
<template>
</template>
<script>
import Component1 from './components/Component1.vue';
import Component2 from './components/Component2.vue';
import Component3 from './components/Component3.vue';
export default {
  name: 'App',
  components: {
    Component1,
    Component2,
    Component3,
  },
};
</script>
然後在 <template></template> 內宣告三個按鈕與這三個元件:
<template>
  <button>Component1</button>
  <button >Component2</button>
  <button>Component3</button>
  <Component1 />
  <Component2 />
  <Component3 />
</template>
所以目前的畫面上,就會同時顯示這三個按鈕與三個元件的內容。
這邊的功能會需要當按鈕按下時,才會根據按下哪一個按鈕顯示對應的元件,所以必須要新增函式來實現這個功能:
<template>
  <button @click="show('tab1')">Component1</button>
  <button @click="show('tab2')">Component2</button>
  <button @click="show('tab3')">Component3</button>
  <Component1 />
  <Component2 />
  <Component3 />
</template>
<script>
import Component1 from './components/Component1.vue';
import Component2 from './components/Component2.vue';
import Component3 from './components/Component3.vue';
export default {
  name: 'App',
  components: {
    Component1,
    Component2,
    Component3,
  },
  data() {
    return {
      tab: 'tab1',
    };
  },
  methods: {
    show(index) {
      this.tab = index;
    },
  },
};
</script>
所以這邊宣告了一個變數 tab,初始值為 tab1。按鈕按下會呼叫 show 這個函式,然後帶入參數會去更新變數 tab。
這樣還不夠,當變數 tab 被更新時,這三個元件也要根據變數 tab 來顯示或者消失,所以使用 v-if 來實現這個功能:
<template>
  <button @click="show('tab1')">Component1</button>
  <button @click="show('tab2')">Component2</button>
  <button @click="show('tab3')">Component3</button>
  <Component1 v-if="tab === 'tab1'" />
  <Component2 v-if="tab === 'tab2'" />
  <Component3 v-if="tab === 'tab3'" />
</template>
<script>
import Component1 from './components/Component1.vue';
import Component2 from './components/Component2.vue';
import Component3 from './components/Component3.vue';
export default {
  name: 'App',
  components: {
    Component1,
    Component2,
    Component3,
  },
  data() {
    return {
      tab: 'tab1',
    };
  },
  methods: {
    show(index) {
      this.tab = index;
    },
  },
};
</script>
如此一來就完成一個基本的使用按鈕來切換頁面的效果。
這個時候如果去修改某一個元件:
<template>
  <p>Component3</p>
  <input type="text" />
</template>
<script>
export default {
  name: 'Component3',
};
</script>
當切換這個按鈕去輸入內容到 input 時,然後又切換到另外一個 Component1 或者 Component2,當再度切換到 Component3 時,會發現這個 input 的內容會被清空。
所以這邊如果要實現元件不會被清空,就要使用 keep alive 來實現:
<template>
  <button @click="show('tab1')">Component1</button>
  <button @click="show('tab2')">Component2</button>
  <button @click="show('tab3')">Component3</button>
  <Component1 v-if="tab === 'tab1'" />
  <Component2 v-if="tab === 'tab2'" />
  <keep-alive>
    <Component3 v-if="tab === 'tab3'" />
  </keep-alive>
</template>
<script>
import Component1 from './components/Component1.vue';
import Component2 from './components/Component2.vue';
import Component3 from './components/Component3.vue';
export default {
  name: 'App',
  components: {
    Component1,
    Component2,
    Component3,
  },
  data() {
    return {
      tab: 'tab1',
    };
  },
  methods: {
    show(index) {
      this.tab = index;
    },
  },
};
</script>
這邊在 Component3 的上層多加了 <keep-alive> 標籤就可以保留元件內的輸入內容了。
Vue3 - 從零開始學 - Day18 [完]